#include <stdio.h>
#include <stdlib.h>
#include "simpleList.h"

//#define SL_DEBUG


// inicia a lista encadeada
// Retorna:
// 	- lista iniciada
struct simpleList *initList()
{
    struct simpleList *L;
    L = (struct simpleList*) calloc(1, sizeof(struct simpleList));
    L->HEAD = NULL;
    L->TAIL = NULL;
    L->length;
	
    return L;
}


// inicia o vetor
// Requer:
//	- tamanho do vetor
// Retorna:
//	- vetor iniciado
struct Vector *initVector(unsigned long length)
{
    struct Vector *V;

    V = (struct Vector*) calloc(1, sizeof(struct Vector));
    V->v = (unsigned long *) calloc(length, sizeof(unsigned long));
    V->length = length;

    return V;
}


// adiciona um valor a uma lista
// Requer:
//	- lista encadeada
//	- valor a ser adicionado
void addToList(struct simpleList *L, unsigned long data)
{
    struct Node *New;

	// inicia um novo no
    New =  (struct Node *) calloc(1, sizeof(struct Node));
    New->NEXT = NULL;
    New->DATA = data;

    if(L->HEAD == NULL)
	{
        L->HEAD = New;
        L->TAIL = New; 
        L->length++;
    }
	    else
	{
        L->TAIL->NEXT = New;
        L->TAIL = New;
        L->length++;
    }
}


// Copia uma lista para o vetor
// Requer:
//	- lista a ser copiada
// Retorna:
//	- vetor ja com os valores da lista
struct Vector *listToVector(struct simpleList *L)
{
    unsigned long i, N;
    struct Vector *V;
    struct Node *p;

    N = L->length;
    if(N == 0) return NULL;

	// inciia o vetor
    V = (struct Vector*) calloc(1, sizeof(struct Vector));

    V->length = N;
    V->v = (unsigned long *) calloc(N+1, sizeof(struct Vector));

    p = L->HEAD;

	// copia os valores
    for(i = 0; i < N; i++)
	{
        V->v[i] = p->DATA;
        p = p->NEXT;
        #ifdef SL_DEBUG
            if(p == L->TAIL) printf("RABO\n");
            printf("V[%lu]%lu\n", i, V->v[i]);
        #endif
    }

    return V;
}


// Libera a lista
// Requer:
//	- lista a ser liberada
void freeList(struct simpleList *L)
{
    int i;
    struct Node *p, *q;

    p = L->HEAD;

    while(p != NULL)
	{
        q = p->NEXT;
        free(p);
        p=q;
    }

    free(L);
}


// Libera o vetor
// Requer:
//	- vetor a ser liberado
void freeVector(struct Vector *V)
{
    free(V->v);
    free(V);
}
